--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 2947df3349dd3d5e38bfa5124c80fd02ac443bab
Parents : 1817137
Author : Mark Qvist <mark@unsigned.io>
Date : 2025-11-01T15:33:24+01:00
Added Heltec v4 board defines and scaffold
Changes
6 files changed, 102 insertions(+), 8 deletions(-)
Diff
diff --git a/Boards.h b/Boards.h
index 74b96d7..47e79c8 100644
--- a/Boards.h
+++ b/Boards.h
@@ -95,6 +95,10 @@
#define MODEL_C5 0xC5 // Heltec Lora32 v3, 433 MHz
#define MODEL_CA 0xCA // Heltec Lora32 v3, 868 MHz
+ #define PRODUCT_H32_V4 0xC3
+ #define BOARD_HELTEC32_V4 0x3B
+ #define MODEL_C8 0xC8 // Heltec Lora32 v3, 850-950 MHz, 28dBm
+
#define PRODUCT_HELTEC_T114 0xC2 // Heltec Mesh Node T114
#define BOARD_HELTEC_T114 0x3C
#define MODEL_C6 0xC6 // Heltec Mesh Node T114, 470-510 MHz
@@ -375,6 +379,44 @@
const int pin_miso = 11;
const int pin_sclk = 9;
+ #elif BOARD_MODEL == BOARD_HELTEC32_V4
+ #define IS_ESP32S3 true
+ #define HAS_DISPLAY true
+ #define HAS_BLUETOOTH false
+ #define HAS_BLE true
+ #define HAS_PMU true
+ #define HAS_CONSOLE true
+ #define HAS_EEPROM true
+ #define HAS_INPUT true
+ #define HAS_SLEEP true
+ #define PIN_WAKEUP GPIO_NUM_0
+ #define WAKEUP_LEVEL 0
+ #define OCP_TUNED 0x18
+
+ const int pin_btn_usr1 = 0;
+
+ #if defined(EXTERNAL_LEDS)
+ const int pin_led_rx = 13;
+ const int pin_led_tx = 14;
+ #else
+ const int pin_led_rx = 35;
+ const int pin_led_tx = 35;
+ #endif
+
+ #define MODEM SX1262
+ #define HAS_TCXO true
+ const int pin_tcxo_enable = -1;
+ #define HAS_BUSY true
+ #define DIO2_AS_RF_SWITCH true
+
+ const int pin_cs = 8;
+ const int pin_busy = 13;
+ const int pin_dio = 14;
+ const int pin_reset = 12;
+ const int pin_mosi = 10;
+ const int pin_miso = 11;
+ const int pin_sclk = 9;
+
#elif BOARD_MODEL == BOARD_RNODE_NG_20
#define HAS_DISPLAY true
#define HAS_BLUETOOTH true
diff --git a/Display.h b/Display.h
index c42283c..ebc02fd 100644
--- a/Display.h
+++ b/Display.h
@@ -60,6 +60,11 @@
#define DISP_ADDR 0x3C
#define SCL_OLED 18
#define SDA_OLED 17
+#elif BOARD_MODEL == BOARD_HELTEC32_V4
+ #define DISP_RST 21
+ #define DISP_ADDR 0x3C
+ #define SCL_OLED 18
+ #define SDA_OLED 17
#elif BOARD_MODEL == BOARD_RAK4631
// RAK1921/SSD1306
#define DISP_RST -1
@@ -265,6 +270,18 @@ bool display_init() {
digitalWrite(pin_display_en, HIGH);
delay(50);
Wire.begin(SDA_OLED, SCL_OLED);
+ #elif BOARD_MODEL == BOARD_HELTEC32_V4
+ // enable vext / pin 36
+ pinMode(Vext, OUTPUT);
+ digitalWrite(Vext, LOW);
+ delay(50);
+ int pin_display_en = 21;
+ pinMode(pin_display_en, OUTPUT);
+ digitalWrite(pin_display_en, LOW);
+ delay(50);
+ digitalWrite(pin_display_en, HIGH);
+ delay(50);
+ Wire.begin(SDA_OLED, SCL_OLED);
#elif BOARD_MODEL == BOARD_LORA32_V1_0
int pin_display_en = 16;
digitalWrite(pin_display_en, LOW);
@@ -382,6 +399,9 @@ bool display_init() {
#elif BOARD_MODEL == BOARD_HELTEC32_V3
disp_mode = DISP_MODE_PORTRAIT;
display.setRotation(1);
+ #elif BOARD_MODEL == BOARD_HELTEC32_V4
+ disp_mode = DISP_MODE_PORTRAIT;
+ display.setRotation(1);
#elif BOARD_MODEL == BOARD_HELTEC_T114
disp_mode = DISP_MODE_PORTRAIT;
display.setRotation(1);
diff --git a/Power.h b/Power.h
index d6af640..766bf55 100644
--- a/Power.h
+++ b/Power.h
@@ -111,6 +111,23 @@
bool bat_voltage_dropping = false;
float bat_delay_v = 0;
float bat_state_change_v = 0;
+#elif BOARD_MODEL == BOARD_HELTEC32_V4
+ #define BAT_V_MIN 3.15
+ #define BAT_V_MAX 4.3
+ #define BAT_V_CHG 4.48
+ #define BAT_V_FLOAT 4.33
+ #define BAT_SAMPLES 7
+ const uint8_t pin_vbat = 1;
+ const uint8_t pin_ctrl = 37;
+ float bat_p_samples[BAT_SAMPLES];
+ float bat_v_samples[BAT_SAMPLES];
+ uint8_t bat_samples_count = 0;
+ int bat_discharging_samples = 0;
+ int bat_charging_samples = 0;
+ int bat_charged_samples = 0;
+ bool bat_voltage_dropping = false;
+ float bat_delay_v = 0;
+ float bat_state_change_v = 0;
#elif BOARD_MODEL == BOARD_HELTEC_T114
#define BAT_V_MIN 3.15
#define BAT_V_MAX 4.165
@@ -154,12 +171,14 @@ uint8_t pmu_rc = 0;
void kiss_indicate_battery();
void measure_battery() {
- #if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC_T114 || BOARD_MODEL == BOARD_TECHO
+ #if BOARD_MODEL == BOARD_RNODE_NG_21 || BOARD_MODEL == BOARD_LORA32_V2_1 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_HELTEC32_V4 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC_T114 || BOARD_MODEL == BOARD_TECHO
battery_installed = true;
battery_indeterminate = true;
#if BOARD_MODEL == BOARD_HELTEC32_V3
float battery_measurement = (float)(analogRead(pin_vbat)) * 0.0041;
+ #elif BOARD_MODEL == BOARD_HELTEC32_V4
+ float battery_measurement = (float)(analogRead(pin_vbat)) * 0.0041;
#elif BOARD_MODEL == BOARD_T3S3
float battery_measurement = (float)(analogRead(pin_vbat)) / 4095.0*6.7828;
#elif BOARD_MODEL == BOARD_HELTEC_T114
@@ -351,6 +370,10 @@ bool init_pmu() {
pinMode(pin_ctrl,OUTPUT);
digitalWrite(pin_ctrl, LOW);
return true;
+ #elif BOARD_MODEL == BOARD_HELTEC32_V4
+ pinMode(pin_ctrl,OUTPUT);
+ digitalWrite(pin_ctrl, LOW);
+ return true;
#elif BOARD_MODEL == BOARD_HELTEC_T114
pinMode(pin_ctrl,OUTPUT);
digitalWrite(pin_ctrl, HIGH);
diff --git a/Utilities.h b/Utilities.h
index cfd523c..79546cd 100644
--- a/Utilities.h
+++ b/Utilities.h
@@ -72,8 +72,8 @@ uint8_t eeprom_read(uint32_t mapped_addr);
#include "Device.h"
#endif
#if MCU_VARIANT == MCU_ESP32
+ //https://github.com/espressif/esp-idf/issues/8855
#if BOARD_MODEL == BOARD_HELTEC32_V3
- //https://github.com/espressif/esp-idf/issues/8855
#include "hal/wdt_hal.h"
#elif BOARD_MODEL == BOARD_T3S3
#include "hal/wdt_hal.h"
@@ -301,6 +301,13 @@ uint8_t boot_vector = 0x00;
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
void led_id_on() { }
void led_id_off() { }
+ #elif BOARD_MODEL == BOARD_HELTEC32_V4
+ void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
+ void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
+ void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
+ void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_LORA32_V2_1
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
@@ -1548,10 +1555,12 @@ bool eeprom_model_valid() {
if (model == MODEL_C4 || model == MODEL_C9) {
#elif BOARD_MODEL == BOARD_HELTEC32_V3
if (model == MODEL_C5 || model == MODEL_CA) {
- #elif BOARD_MODEL == BOARD_HELTEC_T114
- if (model == MODEL_C6 || model == MODEL_C7) {
- #elif BOARD_MODEL == BOARD_RAK4631
- if (model == MODEL_11 || model == MODEL_12) {
+ #elif BOARD_MODEL == BOARD_HELTEC32_V4
+ if (model == MODEL_C8) {
+ #elif BOARD_MODEL == BOARD_HELTEC_T114
+ if (model == MODEL_C6 || model == MODEL_C7) {
+ #elif BOARD_MODEL == BOARD_RAK4631
+ if (model == MODEL_11 || model == MODEL_12) {
#elif BOARD_MODEL == BOARD_HUZZAH32
if (model == MODEL_FF) {
#elif BOARD_MODEL == BOARD_GENERIC_ESP32
diff --git a/sx126x.cpp b/sx126x.cpp
index 30c22d9..18ae7e2 100644
--- a/sx126x.cpp
+++ b/sx126x.cpp
@@ -125,7 +125,7 @@ bool sx126x::preInit() {
pinMode(_ss, OUTPUT);
digitalWrite(_ss, HIGH);
- #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_XIAO_S3
+ #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_HELTEC32_V4 || BOARD_MODEL == BOARD_TDECK || BOARD_MODEL == BOARD_XIAO_S3
SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs);
#elif BOARD_MODEL == BOARD_TECHO
SPI.setPins(pin_miso, pin_sclk, pin_mosi);
diff --git a/sx128x.cpp b/sx128x.cpp
index 71ddac6..59c464e 100644
--- a/sx128x.cpp
+++ b/sx128x.cpp
@@ -134,7 +134,7 @@ bool sx128x::preInit() {
// TODO: Check if this change causes issues on any platforms
#if MCU_VARIANT == MCU_ESP32
- #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_TDECK
+ #if BOARD_MODEL == BOARD_T3S3 || BOARD_MODEL == BOARD_HELTEC32_V3 || BOARD_MODEL == BOARD_HELTEC32_V4 || BOARD_MODEL == BOARD_TDECK
SPI.begin(pin_sclk, pin_miso, pin_mosi, pin_cs);
#else
SPI.begin();
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────